package com.zf.nospring.rabbitmq.workqueue;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.zf.nospring.rabbitmq.nofair.ConsumerNoFair;
import com.zf.nospring.rabbitmq.utils.RabbitUtils;

import java.io.IOException;
import java.util.concurrent.TimeoutException;


/**
 * 多个通道消费同一个队列，每个通道都是一个消费者，同一条消息只会进入一个通道，可以观察一下 deliveryTag 的变化，
 * 默认通过轮询方式把消息均匀的分发给不同的消费者，是公平分发（公平消费）
 * 也可以使用channel.basicQos(prefetchCount) 可以改变消息分发的策略，实现不公平消费，详见：{@link ConsumerNoFair}
 */
public class WorkQueueConsumer {
    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = RabbitUtils.getDefaultConnection();
        Channel channel1 = connection.createChannel();
        Channel channel2 = connection.createChannel();

        // 创建消费者的消费逻辑
        DefaultConsumer defaultConsumer1 = RabbitUtils.getDefaultConsumer(channel1);
        DefaultConsumer defaultConsumer2 = RabbitUtils.getDefaultConsumer(channel2);

        /*从队列中读取消息
        basicConsume(String queue, boolean autoAck, Consumer callback)
            queue 队列名
            autoAck 是否自动确认已经消费了消息
            callback 回调
         */
        // 两个通道消费同一个队列，每个通道都是一个消费者，同一条消息只会进入一个通道，可以观察一下 deliveryTag 的变化
        channel1.basicConsume("hello_work_queues", true, defaultConsumer1);
        channel2.basicConsume("hello_work_queues", true, defaultConsumer2);
    }
}


